package cn.cxq.learning.array;

import org.junit.jupiter.api.Test;

/**
 *剑指offer
 * 旋转数组的最小数字
 * 时间限制：C/C++ 3秒，其他语言6秒 空间限制：C/C++ 64M，其他语言128M 热度指数：1109415
 * 本题知识点： 二分
 *  算法知识视频讲解
 * 题目描述
 * 把一个数组最开始的若干个元素搬到数组的末尾，我们称之为数组的旋转。
 * 输入一个非递减排序的数组的一个旋转，输出旋转数组的最小元素。
 * NOTE：给出的所有元素都大于0，若数组大小为0，请返回0。
 * 示例1
 * 输入
 * 复制
 * [3,4,5,1,2]
 * 返回值
 * 复制
 * 1
 */
public class NumberInRotateArray {

    @Test
    public void test() {
        System.out.println(minNumberInRotateArray(new int[]{3, 4, 5, 1, 2}));
    }

    // 二分查找
    public int minNumberInRotateArray(int[] array) {
        int left = 0;
        int right = array.length - 1;

        int mid = (left + right) / 2;

        int min = array[right];

        while (true) {
            if (array[mid] > min) {
                left = mid + 1;
                mid = (left + right) / 2;
            } else if (array[mid] < min) {
                min = array[mid];
                right = mid;
                mid = (left + right) / 2;
            } else {
                return array[mid];
            }
        }
    }

    // 暴力查找
//    public int minNumberInRotateArray(int[] array) {
//        for (int i = 0; i < array.length - 1; i++) {
//            if (array[i] > array[i + 1]) {
//                return array[i + 1];
//            }
//        }
//
//        return array[0];
//    }
}
